SET(LIBHELLO_SRC hello.cpp)

# 将源文件构建成一个动态库， target 名为hello 生成的动态链接库应该是libhello.so
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

# 再将源文件构建成一个静态库，后缀名为.a
# 注意 这里的名称不能继续使用hello 因为Target不允许重名
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})


# ADD_LIBRARY 指令 用于构建动态库、静态库
#语法 ADD_LIBRARY(
#        libname [SHARED|STATIC|MODULE]  # 生成的库类型有三种 SHARED 动态库 STATIC 静态库
#                                        # MODULE 在使用dyld的系统有效，如果不是dyld系统，则等同于SHARED
#        [EXCLUDE_FROM_ALL]  # 意思是这个库不会被默认构建除非有其他组件依赖或者手工构建
#        source1 source2 ... sourceN
#)


# 如果想构建同名的动态链接库和静态链接库，需要用到SET_TARGET_PROPERTIES，作用是设置输出名称，对于动态库还可以指定动态库和API的版本

#语法： SET_TARGET_PROPERTIES(target1 target2 ...
#        PROPERTIES prop1 value1
#        prop2 value2 ...)
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

# 与SET_TARGET_PROPERTIES对应的是GET_TARGET_PROPERTY(VAR target property)
#　用于获取target的某个属性的值
GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)
MESSAGE(STATUS "This is the hello_static OUTPUT_NAME:" ${OUTPUT_VALUE})

# 如果 生成的文件中之只有libhello.a 而没有 libhello.so 一般是因为cmake在构建新target的时候，会清理同名的构建
# 解决方法就是向这两个同名的target中定义CLEAN_DIRECT_OUTPUT属性=1
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)

# 对于动态链接库，可以使用SET_TARGET_PROPERTIES设置版本
# VERSION代表动态库版本 SOVERSION代表API版本
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)


# 最后，使用INSTALL指令将构建的动态链接库、静态链接库以及头文件安装到系统目录，让人开发使用
INSTALL(TARGETS hello hello_static
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

INSTALL(FILES hello.h DESTINATION include/hello)